Hola.
Como dijo ANELKAOS, lo mejor es utilizar la memoria para leer el archivo.
Escribí una función que lee un archivo grande a la memoria y devuelve la dirección base en donde se encuentra, para luego poder leerlo utilizando ReadProcessMemory y modificarlo con WriteProcessMemory. Esta función puede servir para guardar un archivo grande con un par de modificaciones leves.
Las funciones que utilizo se encuentran en la biblioteca win.tlb que encontré en este mismo foro. Sólo hay que agregar como referencia win.tlb y funciona.
Option Explicit
Function ReadLargeFile(ByVal Filename As String) As Long
Dim lDataChunkSize&
Dim lNumberOfChunks&
Dim hFile&, lFileLen&
Dim lMemOffset&, lReadLen&
Dim hMem&, i&, r&
' Abre el archivo para lectura.
'
hFile = CreateFile(Filename, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
0&, OPEN_EXISTING, 0&, 0&)
If hFile = INVALID_HANDLE_VALUE Then Exit Function
' Se obtiene el tamaño del archivo.
'
lFileLen = GetFileSize(hFile, 0&)
lDataChunkSize = 1024& * 1024& ' Se leerá de a trozos de 1 MB
' Si calcula en cuántas veces se leerá el archivo.
'
lNumberOfChunks = lFileLen \ lDataChunkSize
If lNumberOfChunks = 0 Then
lNumberOfChunks = 1 ' El archivo en menor a 1 MB.
Else
' Calcula la longitud de los datos de la última
' sección del archivo, que seguramente es menor
' a 1 Megabyte.
'
If (lFileLen Mod lDataChunkSize) > 0 Then lNumberOfChunks = lNumberOfChunks + 1
End If
' Asigna memoria para leer el archivo.
'
hMem = VirtualAlloc(0&, lFileLen, MEM_COMMIT, PAGE_READWRITE)
If hMem = 0 Then GoTo FailRead
For i = 1 To lNumberOfChunks
' Se verifica si es la última sección del archivo o no.
'
If i < lNumberOfChunks Then
lReadLen = lDataChunkSize
Else
lReadLen = lFileLen Mod lDataChunkSize
End If
' Lee el trozo del archivo a la memoria.
'
r = ReadFile(hFile, ByVal hMem + lMemOffset, lReadLen, 0, ByVal 0&)
If r = 0 Then GoTo FailRead
' Pasa al siguiente trozo de datos.
'
lMemOffset = lMemOffset + lReadLen
DoEvents
Next
FailRead:
If Err.LastDllError <> ERROR_SUCCESS Then
' Libera la memoria si no se pudo leer el archivo.
'
Debug.Print GetSysErr(Err.LastDllError)
r = VirtualFree(hMem, 0, MEM_RELEASE)
Else
' Devuelve el puntero al inicio del archivo en memoria.
'
ReadLargeFile = hMem
End If
' Cierra el archivo.
'
r = CloseHandle(hFile)
End Function
Function GetSysErr(ByVal ErrNumber As Long) As String
Dim sBuffer$, lLen&
sBuffer = String$(1024, 0)
lLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, ErrNumber, 0&, ByVal sBuffer, 1024, ByVal 0&)
If lLen Then
sBuffer = Left$(sBuffer, lLen)
End If
GetSysErr = sBuffer
End Function
Saludos.
Angellore.